#include <iostream>
#include <signal.h>
#include <cstring> // 等同于stiring.h，但它更好，因为它用了C++的语法例如包括了std命名空间
#include <unistd.h>

using namespace std;

void PrintPending()
{
    sigset_t set;
    sigpending(&set);
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&set, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << "   pid: " << getpid() << endl << endl;
}

void sigcb(int signo)
{
    while (true)
    {
        cout << "catch a signal, signal number: " << signo << endl;
        sleep(1);

        PrintPending();
        sleep(1);
    }
}

int main()
{
    struct sigaction act, oact;
    memset(&act, 0, sizeof(act));
    memset(&oact, 0, sizeof(oact));

    sigemptyset(&act.sa_mask); // 初始化结构体里面的信号集

    // 添加信号到信号集中
    sigaddset(&act.sa_mask, 1);
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);

    act.sa_handler = sigcb;
    sigaction(2, &act, &oact);

    while (true)
    {
        cout << "I am a process: " << getpid() << endl;
        sleep(1);
    }

    return 0;
}